# 使用了 yield 的函数被称为生成器(generator
# Python中一边循环一边计算的机制，叫做生成器
# 3.1 生成器表达式
# 列表推导式
li = [i*5 for i in range(5)]
# 加了括号就变成了生成器
gen = (i*5 for i in range(5))
# print(li)   返回列表
# print(gen)  返回生成器地址
# print(next(gen)) 获取第一个值
# yield的作用:
# 1.类似return,将指定值或者多个值返回给调用者
# 2.yield语句一次返回一个结果，在每个结果中间，挂起函数，执行next(),再重新从挂起点继续往下执行
# 是函数中断，并保存中断的状态其
def gen():
    print("开始了")
    yield 'a'
    yield 'b'
    yield 'c'
print(gen())   #<generator object gen at 0x0000011D4D5C4F40>
for i in gen():
    print(i)
# print(next(gen()))

def gen2(n):
    li = []
    a = 0
    while a < n:
        li.append(a)
        yield a
        a += 1
    print("li:",li)
for i in gen2(5):
    print(i)

#4.三者关系
#可迭代对象:指实现了python迭代协议，可以通过for .in..循环遍历的对象，比如list、dict、str...、迭代器、生成器#迭代器:可以记住自己遍历位置的对象，直观体现就是可以使用nextO函数返回值，迭代器只能往前，不能往后，当遍历完毕之后，next()会抛出异常并#生成器:是特殊的迭代器，需要注意迭代器并不一定是生成器，它是python提供的通过简便的方法写出迭代器的一种手段
# 包含关系:可迭代对象 〉 迭代器 >牛成器




